package com.ming.rental;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Collections;

@SpringBootTest
public class GeneratorCode {

    private static final String AUTHOR = "xiao-ming";

    private static final String JDBC_URL = "jdbc:mysql://localhost:3308/auto_rental";

    private static final String JDBC_USERNAME = "root";

    private static final String JDBC_PASSWORD = "123456";

    private static final String OUT_DIR = ".\\src\\main\\java";

    private static final String PACKAGE_NAME = "com.ming";

    private static final String MODULE_NAME = "rental";

    private static final String[] TABLES = {
           "auto_brand","auto_info","auto_maker",
            "busi_customer","busi_maintain","busi_order","busi_rental_type","busi_violation",
            "sys_dept","sys_permission","sys_role","sys_role_permission","sys_user","sys_user_role"
    };

    private static final String[] PREFIX = { "busi_", "sys_"};

    @Test
    public void generatorCode() {
        // 使用 MyBatis Plus FastAutoGenerator 初始化代码生成器，传入 JDBC 数据库连接信息
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                // 全局配置：设置作者名、启用 Swagger 注解支持、指定生成代码的输出目录
                .globalConfig(builder -> {
                    builder.author(AUTHOR)                // 设置作者名，用于生成类注释中的 @author
                            .enableSwagger()               // 启用 Swagger 注解，在 controller 和 entity 中添加 Swagger 注解支持
                            .outputDir(OUT_DIR);          // 设置生成代码的输出路径为当前项目的 src/main/java 目录
                })
                // 包结构配置：设置包名前缀、模块名，并配置 mapper XML 文件输出路径
                .packageConfig(builder -> {
                    builder.parent(PACKAGE_NAME)          // 设置父包名，这里是 com.ming
                            .moduleName(MODULE_NAME)      // 设置模块名，这里是 rental，最终包路径为 com.ming.rental.*
                            .pathInfo(Collections.singletonMap(OutputFile.xml,
                                    ".\\src\\main\\resources\\mapper"));  // 指定生成的 Mapper XML 文件输出路径

                })
                // 策略配置：定义哪些表需要生成代码、表前缀处理，以及实体类、Controller 的生成策略
                .strategyConfig(builder -> {
                    builder.addInclude(TABLES)            // 添加需要生成代码的表名数组
                            .addTablePrefix(PREFIX)       // 定义需要去除的表前缀，如 busi_, sys_
                            .entityBuilder()              // 开始对 Entity 实体类进行配置
                            .enableLombok()               // 启用 Lombok 注解，自动生成 getter/setter/toString 等方法
                            .enableChainModel()           // 启用链式调用风格（如 setUser().setName()）
                            .controllerBuilder()          // 开始对 Controller 类进行配置
                            .enableRestStyle();           // 启用 Rest 风格控制器（使用 @RestController）
                })
                // 设置模板引擎为 Freemarker
                .templateEngine(new FreemarkerTemplateEngine())
                // 执行代码生成操作
                .execute();

    }
}
